/**
 @file sys_tmg_mac.h

 @date 2023-02-13

 @version v0.1

*/

#ifndef _SYS_TMG_MAC_H
#define _SYS_TMG_MAC_H
#ifdef __cplusplus
extern "C" {
#endif

/****************************************************************
 *
 * Header Files
 *
 ***************************************************************/
#include "sys_usw_mac.h"

/****************************************************************
*
* Defines and Macros
*
****************************************************************/
#define SYS_TMG_MAC_GROUP_NUM                     21
#define SYS_TMG_QMAC_NUM                          4
#define SYS_TMG_GET_INNER_MAC_ID(mac_id)          ((mac_id) % (SYS_TMG_MAX_MAC_NUM_PER_TXQM))
#define SYS_TMG_GET_QUAD_MAC_ID(mac_id)           ((mac_id) % SYS_TMG_QMAC_NUM)
#define SYS_TMG_GET_MAC_GROUP(mac_id)             ((mac_id) / SYS_TMG_QMAC_NUM)
#define SYS_TMG_GET_TXQM_BY_MAC_ID(mac_id)        ((mac_id) / (SYS_TMG_MAX_MAC_NUM_PER_TXQM))
#define SYS_TMG_GET_DP_TXQM_BY_MAC_ID(mac_id)     (((mac_id) / (SYS_TMG_MAX_MAC_NUM_PER_TXQM)) % (SYS_TMG_TXQM_NUM_PER_DP))
#define SYS_TMG_MACID_NUM_PER_DP                  40
#define SYS_TMG_GET_DP_MAC_CLIENT(mac_client)     ((mac_client) % (SYS_TMG_MAC_CLIENT_NUM_PER_DP))
#define SYS_TMG_GET_DP_FROM_MAC_CLIENT(mac_client)     ((mac_client) % (SYS_TMG_MAC_CLIENT_NUM_PER_DP))
#define SYS_TMG_GET_TXQM_MAC_CLIENT(mac_client)   ((mac_client) % (SYS_TMG_MAC_CLIENT_NUM_PER_TXQM))
#define SYS_TMG_GET_DP_TXQM(mac_client)           ((mac_client) / (SYS_TMG_MAC_CLIENT_NUM_PER_TXQM))
#define SYS_TMG_GET_DP_TXQM_BY_TXQM(txqm)         ((txqm) % SYS_TMG_TXQM_NUM_PER_DP)
#define SYS_TMG_GET_DP_MAC_ID(mac_id)             ((mac_id) % (SYS_TMG_MACID_NUM_PER_DP))
#define SYS_TMG_CL73_ACC_TIMEOUT                  10000

#ifdef EMULATION_ENV
#define SYS_TMG_PSD_WITH_HSS32G_MODULE(psd)       (((16 <= psd) && (psd <= 31)) || ((80 <= psd) && (psd <= 83)))
#endif

enum sys_tmg_cl73_io_type_e
{
    READ_REG,
    WRITE_REG,
    IO_TYPE_MAX
};
typedef enum sys_tmg_cl73_io_type_e sys_tmg_cl73_io_type_t;

enum sys_tmg_cl73_io_status_type_e
{
    TMG_CL73_ACC_IO_TYPE,
    TMG_CL73_ACC_IO_ERR,
    TMG_CL73_ACC_IO_OVERLAP,
    TMG_CL73_ACC_IO_DONE,
    TMG_CL73_ACC_IO_TIMEOUT,
    TMG_CL73_ACC_IO_ERR_TYPE_MAX
};
typedef enum sys_tmg_cl73_io_status_type_e sys_tmg_cl73_io_status_type_t;

/*FIELD_DEFINE*/
#define TMG_CL73_FLD_DEF(address, hi_bit, lo_bit) { \
    address, \
    hi_bit, \
    lo_bit, \
    (hi_bit-lo_bit) + 1, \
    (uint32) ((((uint64) 1 << ((hi_bit-lo_bit) + 1)) - 1) << lo_bit), \
    (uint32) ~((((uint64) 1 << ((hi_bit-lo_bit) + 1)) - 1) << lo_bit)}

/*EXTRACT_FIELD*/
#define TMG_CL73_FLD(xFIELD) { \
    xFIELD.address, \
    xFIELD.hi_bit, \
    xFIELD.lo_bit, \
    xFIELD.total_bits, \
    xFIELD.mask, \
    xFIELD.retain_mask}

struct _sys_tmg_cl73_field_s
{
    uint32 address;
    int16  hi_bit;
    int16  lo_bit;
    int16  total_bits;
    uint32 mask;
    uint32 retain_mask;
};
typedef struct _sys_tmg_cl73_field_s _sys_tmg_cl73_field_t;

#define TMG_CL73_REG_STR(FLD_DEF) (&((_sys_tmg_cl73_field_t)FLD_DEF))

/*AnethInterruptNormal*/
#define TMG_CL73_AN_INCOMPATIBLE_LINK(entry)        TMG_CL73_FLD_DEF(0x40 + 4 * entry, 1, 1)
#define TMG_CL73_AN_PARALLEL_DET_FAULT(entry)       TMG_CL73_FLD_DEF(0x40 + 4 * entry, 0, 0)

/*AnethAdvAbility*/
#define TMG_CL73_CFG_TX_NONCE                       TMG_CL73_FLD_DEF(0x18,  4,  0)
#define TMG_CL73_NEXT_PAGE_TX1_47_32                TMG_CL73_FLD_DEF(0x14, 15,  0)
#define TMG_CL73_NEXT_PAGE_TX1_31_0                 TMG_CL73_FLD_DEF(0x10, 31,  0)
#define TMG_CL73_NEXT_PAGE_TX0_47_32                TMG_CL73_FLD_DEF(0x0c, 15,  0)
#define TMG_CL73_NEXT_PAGE_TX0_31_0                 TMG_CL73_FLD_DEF(0x08, 31,  0)
#define TMG_CL73_NEXT_PAGE_LOADED                   TMG_CL73_FLD_DEF(0x04, 31, 31)
#define TMG_CL73_BASE_PAGE_47_32                    TMG_CL73_FLD_DEF(0x04, 15,  0)
#define TMG_CL73_BASE_PAGE_31_0                     TMG_CL73_FLD_DEF(0x00, 31,  0)

/*AnethCtl*/
#define TMG_CL73_TECH_BIT_CHECK_EN                  TMG_CL73_FLD_DEF(0x58, 31, 31)
#define TMG_CL73_NEXT_PAGE_NUM                      TMG_CL73_FLD_DEF(0x58, 29, 28)
#define TMG_CL73_AUTO_NEXT_PAGE_EN                  TMG_CL73_FLD_DEF(0x58, 24, 24)
#define TMG_CL73_IGNORE_STATUS_CHECK                TMG_CL73_FLD_DEF(0x58, 20, 20)
#define TMG_CL73_ANETH_BIT_DIV_SEL                  TMG_CL73_FLD_DEF(0x58, 17, 16)
#define TMG_CL73_LOOPBACK_EN                        TMG_CL73_FLD_DEF(0x58,  8,  8)
#define TMG_CL73_RESTART_AN                         TMG_CL73_FLD_DEF(0x58,  4,  4)
#define TMG_CL73_AN_EN                              TMG_CL73_FLD_DEF(0x58,  0,  0)

/*AnethDebugStatus*/
#define TMG_CL73_DBG_RECOVER_SUCCEED                TMG_CL73_FLD_DEF(0x54, 16, 16)
#define TMG_CL73_DBG_RECOVER_STATE                  TMG_CL73_FLD_DEF(0x54, 14, 12)
#define TMG_CL73_DBG_TX_PAGE_STATE                  TMG_CL73_FLD_DEF(0x54, 10,  8)
#define TMG_CL73_DBG_RX_PAGE_STATE                  TMG_CL73_FLD_DEF(0x54,  6,  4)
#define TMG_CL73_DBG_ARB_STATE                      TMG_CL73_FLD_DEF(0x54,  3,  0)

/*AnethNegAbility*/
#define TMG_CL73_MON_LP_NEXT_PAGE_CNT               TMG_CL73_FLD_DEF(0x38, 30, 28)
#define TMG_CL73_MON_PAUSE_TX_ENABLE                TMG_CL73_FLD_DEF(0x38, 24, 24)
#define TMG_CL73_MON_PAUSE_RX_ENABLE                TMG_CL73_FLD_DEF(0x38, 23, 23)
#define TMG_CL73_MON_TX_NEW_TOGGLE                  TMG_CL73_FLD_DEF(0x38, 22, 22)
#define TMG_CL73_MON_TX_NEW_NONCE_UPD               TMG_CL73_FLD_DEF(0x38, 21, 21)
#define TMG_CL73_MON_TX_NEW_NONCE                   TMG_CL73_FLD_DEF(0x38, 20, 16)
#define TMG_CL73_MON_NEGOTIATED_FEC                 TMG_CL73_FLD_DEF(0x38, 15, 15)
#define TMG_CL73_MON_NEGOTIATED_TECH_UPD            TMG_CL73_FLD_DEF(0x38, 14, 14)
#define TMG_CL73_MON_NEGOTIATED_TECH                TMG_CL73_FLD_DEF(0x38, 13,  0)
#define TMG_CL73_MON_LP_NEXT_PAGE1_47_32            TMG_CL73_FLD_DEF(0x34, 15,  0)
#define TMG_CL73_MON_LP_NEXT_PAGE1_31_0             TMG_CL73_FLD_DEF(0x30, 31,  0)
#define TMG_CL73_MON_LP_NEXT_PAGE0_47_32            TMG_CL73_FLD_DEF(0x2c, 15,  0)
#define TMG_CL73_MON_LP_NEXT_PAGE0_31_0             TMG_CL73_FLD_DEF(0x28, 31,  0)
#define TMG_CL73_MON_LP_BASE_PAGE_47_32             TMG_CL73_FLD_DEF(0x24, 15,  0)
#define TMG_CL73_MON_LP_BASE_PAGE_31_0              TMG_CL73_FLD_DEF(0x20, 31,  0)

/*AnethStatus*/
#define TMG_CL73_MON_RX_LCW_RST                     TMG_CL73_FLD_DEF(0x50,  9,  9)
#define TMG_CL73_MON_LINK_STATUS                    TMG_CL73_FLD_DEF(0x50,  8,  8)
#define TMG_CL73_MON_LP_AN_EN                       TMG_CL73_FLD_DEF(0x50,  7,  7)
#define TMG_CL73_MON_INCOMPATIBLE_LINK              TMG_CL73_FLD_DEF(0x50,  6,  6)
#define TMG_CL73_MON_NONCE_MATCH_ERR                TMG_CL73_FLD_DEF(0x50,  5,  5)
#define TMG_CL73_MON_PARALLEL_DETECT_FAIL           TMG_CL73_FLD_DEF(0x50,  4,  4)
#define TMG_CL73_MON_RF_DETECTED                    TMG_CL73_FLD_DEF(0x50,  3,  3)
#define TMG_CL73_MON_RECEIVE_IDLE_ERR               TMG_CL73_FLD_DEF(0x50,  2,  2)
#define TMG_CL73_MON_PAGE_RX                        TMG_CL73_FLD_DEF(0x50,  1,  1)
#define TMG_CL73_MON_AN_COMPLETE                    TMG_CL73_FLD_DEF(0x50,  0,  0)


/****************************************************************************
 *
* Function
*
*****************************************************************************/
extern int32 sys_tmg_mac_init(uint8 lchip);

#ifdef __cplusplus
}
#endif

#endif

